#include "stm32f10x.h"                  // Device header
#include <stdio.h>  //printf 定向打印所用库
#include <stdarg.h>//sprintf 打印所用库

uint8_t Serial_RxData;//读取
uint8_t Serial_RxFlag;//标志位

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;//结构体变量
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_9;//设置端口 TX
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//输出速度
	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化  供USART1的TX使用
	
	GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;//上拉输出
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;//设置端口 RX
	GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;//输出速度
	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化  供USART1的TX使用
	
	USART_InitTypeDef USART_InitStruture;//结构体
	USART_InitStruture.USART_BaudRate= 9600;//波特率
	USART_InitStruture.USART_HardwareFlowControl= USART_HardwareFlowControl_None;//硬件流控制（无流控）
	USART_InitStruture.USART_Mode= USART_Mode_Tx|USART_Mode_Rx;//模式 发送 接收
	USART_InitStruture.USART_Parity= USART_Parity_No;//校验位（无校验）
	USART_InitStruture.USART_StopBits= USART_StopBits_1;//停止位 1位
	USART_InitStruture.USART_WordLength= USART_WordLength_8b;//字长 8位
	USART_Init(USART1,&USART_InitStruture);//初始化
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//RXNE中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组
	
	NVIC_InitTypeDef NVIC_InitStructure;//结构体
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//中断通道
	NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1,ENABLE);//始能
}

void Serial_SendByte(uint8_t Byte)//发送一个字节
{
	USART_SendData(USART1,Byte);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等到标志位循环结束  RESET相当于1
}

void Serial_SendArray(uint8_t *Array,uint16_t Length)//发送一个数组
{
	uint16_t i;
	for(i=0;i<Length;i++)
	{
		Serial_SendByte(Array[i]);//uint16_t范围以内
	}
}

void Serial_SendString(char *String)//发送字符串
{
	uint8_t i;
	for(i=0;String[i]!='\0';i++)
	{
		Serial_SendByte(String[i]);
	}
}

uint32_t Serial_Pow(uint32_t X,uint32_t Y)//次方函数
{
	uint32_t Result=1;
	while(Y--)
	{
		Result*=X;
	}
	return Result;
}

void Serial_SendNumber(uint32_t Number,uint8_t Length)//发送数字
{
	uint8_t i;
	for(i=0;i<Length;i++)
	{
		Serial_SendByte(Number/Serial_Pow(10,Length-i-1)%10+0x30);//参数会以十进制从高位到低位依次发送
	}
}

int fputc(int ch,FILE *f)//fputc重定向到串口  fputc是printf函数的底层
{
	Serial_SendByte(ch);
	return ch;
}

void Serial_Printf(char *format,...)//接收可变参数列表
{
	char String[100];//定义输出字符串
	va_list arg;//参数列表变量
	va_start(arg,format);//从format位置开始接收参数表，放在arg里面
	vsprintf(String,format,arg);//打印
	va_end(arg);//释放参数表
	Serial_SendString(String);//发送
}

uint8_t Serial_GetRxFlag(void)//自动清除标志位
{
	if(Serial_RxFlag==1)
	{
		Serial_RxFlag=0;
		return 1;
	}
	return 0;
}

uint8_t Serial_GetRxData(void)//返回
{
	return Serial_RxData;
}

void USART1_IRQHandler(void)//接收中断
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)
	{
		Serial_RxData=USART_ReceiveData(USART1);//读取
		Serial_RxFlag=1;//置标志位
		
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);//再手动清除，以防万一
	}
}
